依存関係のあるVPCを削除したい
こんにちは、不要になったVPCを削除する際に依存関係エラーにハマった下地です。今回はVPCを削除するために行った内容についてまとめます。
VPC依存関係の確認
はじめに、CLIコマンドec2 delete-vpc
を使用し依存関係があるVPCを削除してみます。
$ aws ec2 delete-vpc --vpc-id vpc-***************** An error occurred (DependencyViolation) when calling the DeleteVpc operation: The vpc 'vpc-*****************' has dependencies and cannot be deleted.
上記のように依存関係があるために失敗したとレスポンスが返ってきました。この時にVPC削除するために依存関係にある内容全て削除する必要があると気付き、こちらのサイトを参考に依存関係のある内容について確認しました。
Amazon VPC を削除しようとしたのですが、依存関係エラーが発生しました。Amazon VPC を削除する方法を教えてください。
VPCを削除するには下記の内容を確認する必要があること記載しております。
すべてのインスタンスを終了する すべてのサブネットを削除する カスタムセキュリティグループとカスタムルートテーブルを削除する インターネットゲートウェイまたは仮想プライベートゲートウェイをデタッチする
VPCを作成して時間が経っていることもあり上記の内容を確認するには時間がかかりそうだなと思ったのですが依存関係を調べるcliコマンドがまとまっていましたので、シェルファイル(check_before_delete_vpc.sh)として確認する内容を作成しました。
#!/bin/bash vpc="vpc-*****************" aws ec2 describe-internet-gateways --filters 'Name=attachment.vpc-id,Values='$vpc | grep InternetGatewayId aws ec2 describe-subnets --filters 'Name=vpc-id,Values='$vpc | grep SubnetId aws ec2 describe-route-tables --filters 'Name=vpc-id,Values='$vpc | grep RouteTableId aws ec2 describe-network-acls --filters 'Name=vpc-id,Values='$vpc | grep NetworkAclId aws ec2 describe-vpc-peering-connections --filters 'Name=requester-vpc-info.vpc-id,Values='$vpc | grep VpcPeeringConnectionId aws ec2 describe-vpc-endpoints --filters 'Name=vpc-id,Values='$vpc | grep VpcEndpointId aws ec2 describe-nat-gateways --filter 'Name=vpc-id,Values='$vpc | grep NatGatewayId aws ec2 describe-security-groups --filters 'Name=vpc-id,Values='$vpc | grep GroupId aws ec2 describe-instances --filters 'Name=vpc-id,Values='$vpc | grep InstanceId aws ec2 describe-vpn-connections --filters 'Name=vpc-id,Values='$vpc | grep VpnConnectionId aws ec2 describe-vpn-gateways --filters 'Name=attachment.vpc-id,Values='$vpc | grep VpnGatewayId aws ec2 describe-network-interfaces --filters 'Name=vpc-id,Values='$vpc | grep NetworkInterfaceId
削除したいVPCのidを設定し実行します。
$ bash check_before_delete.sh "InternetGatewayId": "igw-*****************", "SubnetId": "subnet-***************_1", "SubnetId": "subnet-***************_2", "RouteTableId": "rtb-******_default", "RouteTableId": "rtb-******_default", "RouteTableId": "rtb-******_custem", "RouteTableId": "rtb-******_custem", "NetworkAclId": "acl-******_default", "NetworkAclId": "acl-******_default", "NetworkAclId": "acl-******_custem"", "NetworkAclId": "acl-******_custem"", "GroupId": "sg-******_custem_1"", "GroupId": "sg-******_default", "GroupId": "sg-******_default", "GroupId": "sg-******_custem_2", "GroupId": "sg-******_custem_3",
VPCに依存している項目が出力されました!
VPCの依存関係を解消するには表示内容の_custemとなっているところを削除する必要がありますので、それぞれ削除していきます。
_defaultとなっている項目は削除できませんがIDのみだとどれか判断できませんので_defaultを削除しようとした際のエラーについてもまとめていきます。
依存関係を削除
項目ごとに削除していきます。
security-groupの削除
まずは、ec2 delete-security-group
を使用しsecurity-group(sg)から削除します。以下のように実行し3つのカスタムsgを削除することができました(実行後の戻り値はNoneですので削除できた場合何も返ってこない)。
$ aws ec2 delete-security-group --group-id sg-******_custem_1 $ aws ec2 delete-security-group --group-id sg-******_custem_2 $ aws ec2 delete-security-group --group-id sg-******_custem_3
デフォルトのsgを削除しようとした際は以下のエラーが発生します。
$ aws ec2 delete-security-group --group-id sg-******default An error occurred (CannotDelete) when calling the DeleteSecurityGroup operation: the specified group: "sg-******default" name: "default" cannot be deleted by a user
NACLの削除
次にec2 delete-network-acl
を使用しNACLの削除します。sgと同じくdefalutを削除しようとした際にエラーが発生します。
$ aws ec2 delete-network-acl --network-acl-id acl-******_custem $ aws ec2 delete-network-acl --acl-******default An error occurred (InvalidParameterValue) when calling the DeleteNetworkAcl operation: cannot delete default network ACL acl-******default
subnetの削除
ec2 delete-subnet
を使用してsubnetを削除します。subnetにはdefaultがないのですべて削除できます。
$ aws ec2 delete-subnet --subnet-id subnet-***************_1 $ aws ec2 delete-subnet --subnet-id subnet-***************_2
ルートテーブルの削除
ec2 delete-route-table
を使用してルートテーブルを削除します。削除時にはsgと同じくcustemは削除できましたがdefaultは削除できません。
$ aws ec2 delete-route-table --route-table-id rtb-******_custem $ aws ec2 delete-route-table --route-table-id rtb-******_default An error occurred (DependencyViolation) when calling the DeleteRouteTable operation: The routeTable 'rtb-******_default' has dependencies and cannot be deleted
ルートテーブルもdefaultは削除できませんが、エラー内容をみてみるとルートテーブル自体も依存関係があるために削除できないとも読み取れましたので詳細を確認します。
$ aws ec2 describe-route-tables --route-table-id rtb-******_default { "RouteTables": [ { "Associations": [ { "Main": true, "RouteTableAssociationId": "rtbassoc-default", "RouteTableId": "rtb-default", "AssociationState": { "State": "associated" ...
ルートテーブルに関連づけられているrtbassoc-default
を外せば良いのかと思い実行しました。
$ aws ec2 disassociate-route-table --association-id rtbassoc-default An error occurred (InvalidParameterValue) when calling the DisassociateRouteTable operation: cannot disassociate the main route table association rtbassoc-default
結果としてルートテーブルがdefaultであるために関連を外せない事に気づきました。ID番号だけだと判断ができませんでした。
インターネットゲートウェイの削除
最後にインターネットゲートウェイ(igw)を削除します。igwを削除する前には関連しているVPCからデタッチする必要があります。ec2 detach-internet-gateway
にてVPCからデタッチし、ec2 delete-internet-gateway
にてigwを削除します。
$ aws detach-internet-gateway --internet-gateway-id igw-***************** --vpc-id vpc-***************** $ aws delete-internet-gateway --internet-gateway-id igw-*****************
VPC削除
依存関係のある項目をすべて削除できましたので最後にVPCを削除します。
$ aws ec2 delete-vpc --vpc-id vpc-*****************
エラー内容もなく削除されたようです。確認のため、describeで削除したvpcのidを調べて確認します。
$ aws ec2 describe-vpcs --vpc-id vpc-***************** An error occurred (InvalidVpcID.NotFound) when calling the DescribeVpcs operation: The vpc ID 'vpc-*****************' does not exist
削除されたことの確認ができました!
まとめ
不要になったVPCを削除する際の依存関係の調べ方と削除についてまとめました。参考リンクに確認するべき内容のcliコマンドがまとまっていたので依存関係解消する際の目印になりました。この記事がどなたかの助けになれば幸いです。